import { defineStore } from 'pinia'

/**
 * 上下文菜单Store - 管理所有上下文菜单的状态
 * 确保应用中同一时间只有一个上下文菜单打开
 */
export const useMenuStore = defineStore('menu', {
  state: () => ({
    // 当前菜单状态
    visible: false,
    position: { x: 0, y: 0 },
    
    // 菜单数据
    type: '',        // 菜单类型: table, database, connection 等
    data: null,      // 菜单相关的数据
    
    // 菜单回调
    onCommand: null, // 处理菜单命令的回调函数
    
    // 全局点击监听器是否已添加
    listenerAdded: false
  }),
  
  getters: {
    isVisible: (state) => state.visible,
    menuPosition: (state) => state.position,
    menuData: (state) => state.data,
    menuType: (state) => state.type
  },
  
  actions: {
    /**
     * 显示上下文菜单
     * @param {Object} options - 菜单选项
     * @param {string} options.type - 菜单类型
     * @param {Object} options.data - 菜单数据
     * @param {number} options.x - 菜单x坐标
     * @param {number} options.y - 菜单y坐标
     * @param {Function} options.onCommand - 命令回调
     */
    showMenu({ type, data, x, y, onCommand }) {
      // 确保首先关闭任何已打开的菜单
      this.closeMenu()
      
      console.log('打开菜单:', { type, x, y })
      
      // 更新菜单状态
      this.type = type
      this.data = data
      this.position = { x, y }
      this.onCommand = onCommand
      
      // 添加全局点击事件监听器（如果尚未添加）
      this.ensureGlobalListener()
      
      // 显示菜单
      this.visible = true
    },
    
    /**
     * 关闭上下文菜单
     */
    closeMenu() {
      if (this.visible) {
        console.log('关闭菜单')
      }
      
      this.visible = false
      this.data = null
      this.onCommand = null
    },
    
    /**
     * 确保全局点击监听器已添加
     */
    ensureGlobalListener() {
      if (!this.listenerAdded) {
        console.log('添加全局菜单事件监听器')
        
        // 添加全局点击事件，关闭菜单
        document.addEventListener('mousedown', this.handleGlobalMouseDown)
        
        // 添加Escape键关闭菜单
        document.addEventListener('keydown', this.handleKeyDown)
        
        this.listenerAdded = true
      }
    },
    
    /**
     * 处理键盘事件
     */
    handleKeyDown(event) {
      if (event.key === 'Escape' && this.visible) {
        this.closeMenu()
      }
    },
    
    /**
     * 全局鼠标点击事件处理（同时处理左键和右键）
     */
    handleGlobalMouseDown(event) {
      // 如果点击的不是菜单内部元素，关闭菜单
      // 注意：这会同时处理左键和右键点击
      if (this.visible && !event.target.closest('.global-context-menu')) {
        this.closeMenu()
      }
    },
    
    /**
     * 处理菜单命令
     */
    handleCommand(command) {
      console.log('处理菜单命令:', command, this.data)
      
      // 保存回调和数据以防它们在关闭菜单时被清除
      const callback = this.onCommand
      const data = this.data
      
      // 关闭菜单
      this.closeMenu()
      
      // 调用注册的回调
      if (callback && typeof callback === 'function') {
        callback(command, data)
      }
    },
    
    /**
     * 清理监听器
     */
    cleanup() {
      if (this.listenerAdded) {
        document.removeEventListener('mousedown', this.handleGlobalMouseDown)
        document.removeEventListener('keydown', this.handleKeyDown)
        this.listenerAdded = false
      }
    }
  }
}) 